package com.zs.basic.runoob

/**
 *  Kotlin 数据类与密封类
 * @description
 * @author madison
 * @date 2021/6/4 09:28
 *
 */

data class User1(val name: String, val age: Int)

//复制使用 copy() 函数，我们可以使用该函数复制对象并修改部分属性, 对于上文的 User 类，其实现会类似下面这样：
//fun copy(name: String = this.name, age: Int = this.age) = User1(name, age)


//密封类
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()

fun eval(expr: Expr): Double = when (expr) {
    is Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN
    // 不再需要 `else` 子句，因为我们已经覆盖了所有的情况
//    else -> Double.NaN
}

fun main() {
    val jack = User1("Jack", 18)
    val olderJack = jack.copy(age = 2)
    println(jack)
    println(olderJack)

    //数据类以及解构声明
    val jane = User1("Jane", 35)
    val (name, age) = jane
    println("$name, $age years of age") // prints "Jane, 35 years of age"
}